메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

네트워크 스캐닝하기

한빛미디어

|

2002-01-03

|

by HANBIT

10,417

저자: 드루 라빈(Dru Lavigne) 우리는 IP 패킷과 TCP/IP 접속을 조사하는데 꽤 많은 시간을 들였었다. 이제부터는 FreeBSD 시스템의 보안 수준을 높이기 위해 지금까지 익혀온 지식을 한데 모아 직접 시연해보이도록 하겠다. 내 홈 네트워크에는 FreeBSD 4.2를 실행하는 컴퓨터가 있다. 그 컴퓨터는 케이블 모뎀을 사용하는 인터넷에 계속해서 연결되어 있다. 이 시점에서 이 시스템에 변형을 준 것은 단지 보안과 관련된 부분으로 "BSD 데몬 보호"에서 시연해 보인 TCP 래퍼를 초기설정 하는 것이었다. 그렇지만 인터넷에 계속적으로 노출되어 있기 때문에 내 FreeBSD 시스템이 발견하려고 노력하는 사람에게 주고 싶어하는 정보는 알고있어야 한다. 내가 이것에 대해 알고있는 이상 인터넷에서 내 기계로 어느 IP 패킷을 허용하려고 하는지 결정할 수 있다. 포트 컬렉션은 nmap 유틸리티를 포함하고 있으며 여러분의 FreeBSD 시스템 중 어떤 서비스가 다른 TCP/IP 호스트를 광고하는지 결정할 수 있는 귀중한 도구이다. 그러나 다른 대부분의 유용한 유틸리티처럼 그것은 여러분 네트워크 내에 있는 컴퓨터를 테스트 하기위해서만 사용되어야 한다. 그리고 사악한 유저들이 인터넷에 있는 불안정한 호스트를 위한 스캔에 이 유틸리티를 사용하는 것이 아주 흔한 일인 것도 알고 있어야 한다. 단지 그들이 무엇을 보기 바라느냐를 알 수 있는 것을 확실히 측정할 수 있도록 여러분의 시스템에 대해 발견할 수 있는 것들을 우선 찾아내는 것이 여러분에게는 더 낫다. 나는 수퍼유저로 인터넷에 접속하여 nmap을 설치할 것이다. 일단 설치가 끝난다고 하더라도 나는 수퍼유저 계정을 남겨놓을 것이다.
su
Password:
cd /usr/ports/security/nmap
make install clean
exit
nmap 유틸리티는 몇몇 상이한 스캔 타입을 수반하기 때문에 여러분은 몇몇 상이한 작동을 위해 여러분의 네트워크 데몬을 테스트할 수 있다. 나는 내가 스캔하기 원하는 똑같은 머신위에서 nmap을 실행할 것이기 때문에 "localhost"에 반대하여 내 스캔을 실행할 것이다. 만약 네트워크에 있는 또다른 호스트를 스캔하고 싶다면 "localhost"라는 단어 대신에 IP 주소를 써라. 그렇다면 스캔 타입을 명세하지 않는 것으로부터 시작해 보자. 이것은 어떤 데몬이 TCP 접속을 듣고있는지 결정하기 위한 nmap 유틸리티를 말할 것이다.
nmap -v localhost

Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ ) 
No tcp,udp, or ICMP scantype specified, assuming vanilla tcp connect() scan. Use -sP 
if you really don"t want to portscan (and just want to see what hosts are up). 
Host localhost (127.0.0.1) appears to be up ... 
good. 
Initiating TCP connect() scan against localhost (127.0.0.1) 
Adding TCP port 515 (state open). 
Adding TCP port 22 (state open). 
Adding TCP port 80 (state open). 
Adding TCP port 6000 (state open). 
Adding TCP port 111 (state open). 
Adding TCP port 25 (state open). 
Adding TCP port 587 (state open). 
The TCP connect scan took 7 seconds to scan 1523 ports. 
Interesting ports on localhost (127.0.0.1): 
(The 1517 ports scanned but not shown below are in state: closed)

Port       State       Service
22/tcp     open        ssh                     
25/tcp     open        smtp    
80/tcp	   open        http                
111/tcp    open        sunrpc                  
515/tcp    open        printer                 
587/tcp    open        submission              
6000/tcp   open        X11
 
Nmap run completed -- 1 IP address (1 host up) scanned in 8 seconds 
여러분은 이와 같은 출력 결과를 내가 망쳐놓았던 텔넷에서 보았을 수도 있다. 그리고 내 시스템 (http)에 아파치를 추가했다고 알아차렸을 수도 있으며 NFS (sunrpc)를 가지고 플레이하고 있었다. 이제 내가 콘솔을 보기위해 Alt-F1을 사용한다면 다음과 같은 흥미로운 메시지를 받게 될 것이다.
icmp-response bandwidth limit 364/200 pps
icmp-response bandwidth limit 335/200 pps
icmp-response bandwidth limit 380/200 pps
icmp-response bandwidth limit 482/200 pps
icmp-response bandwidth limit 418/200 pps
icmp-response bandwidth limit 246/200 pps
icmp-response bandwidth limit 317/200 pps
콘솔에서 이러한 형태의 메시지를 본적이 있다면 nmap 유틸리티를 실행하지 않았다는 뜻이며 누군가가 개방 포트를 찾으려는 머신을 스캐닝하고 있다고 생각해도 된다. nmap이 내 포트를 스캔 할 때 그것은 내 포트의 1523에 접속하려고 노력하며 내 FreeBSD 시스템은 각각의 듣지 않는 포트에 대해 ICMP Type 3 Code 3 응답을 보냄으로써 반응했다(ICMP에 대한 지난번 기사 참고). 디폴트로 FreeBSD는 일 초당 200 타입의 패킷을 전송하는 한계가 있다. 이러한 한계는 제어할 수 있는 것보다 더 많은 패킷에 응답하려는 시도를 방지하기 때문에 좋은 것이라고 말할 수 있다. 이 콘솔 메시지에 대한 FAQ는 여기에서 볼 수 있다. 이제 이 nmap 스캔으로부터 얻은 결과로 내가 무엇을 해야 할까? 경험상 여러분이 사용하지 않는 모든 포트를 사용 불가능하도록 해야 한다. 여러분이 정말로 사용하고자 하는 포트는 불능 상태로 만들 수 없기 때문에 여러분은 이러한 포트를 안전하게 해야 할 필요가 있다. 내가 든 예제에서 나는 ssh, smtp, http, X11등과 같은 서비스를 실제로 사용하고 있기 때문에 이런 포트를 불능 상태로 만들고 싶지는 않았다. 그래서 적절한 호스트만이 접근할 수 있도록 방화벽을 만들 때 이러한 사항을 기억해두어야만 할 것이다. 나는 더 이상 NFS를 사용하지 않기 때문에 sunrpc을 불능 상태로 만들어야 한다. 이 컴퓨터는 아무 프린터로 접근할 수 없기 때문에 프린터는 불능 상태가 되어야 한다. 마지막으로 메일 클라이언트는 서브미션 포트를 사용하지 않기 때문에 나는 이것 또한 제거해야 한다. 나는 수퍼유저가 되어 아래의 라인에 /etc/rc.conf를 추가함으로써 sunrpc와 프린터 데몬을 불능 상태로 만들 수 있다.
portmap_enable="NO"
lpd_enable="NO"
변화 사항을 저장하기 전에 나는 오탈자를 다시 한 번 더 점검할 것이다. 사태는 서브미션 포트를 제거함에 따라 약간씩 더 복잡해진다. (만약 어떤 서브미션 포트가 사용되는지 확실히 알지 못한다면 FreeBSD에 있는 메일링 리스트에 설명을 보면된다. 그 사이트에 설명이 잘 되어 있으므로…) 나는 센드메일로 내 이메일을 보내기 때문에 이 컴퓨터에 있는 센드메일 서비스를 못쓰게 만들고 싶지않다. 따라서 어떤 변화를 가하기 전에 내 센드메일 환경설정 파일 원본을 백업시켜 두고 더 세심한 주의를 기울일 것이다. 나는 아직도 수퍼유저 상태이기 때문에 다음과 같이 타이핑할 수 있다.
cp /etc/mail/sendmail.cf /etc/mail/sendmail.cf.orig
FreeBSD를 설치했을 때 freebsd.mc라고 불리는 파일은 센드메일 초기설정 파일을 생성하는데 사용되었다. 서브미션 포트를 불능 상태로 만들기 위해 명령의 일부를 변경함에 따라 나는 이 파일 또한 백업시켜 둘 것이다.
cd /usr/src/etc/sendmail
cp freebsd.mc freebsd.mc.orig
만약 여러분의 FreeBSD 시스템에 이 디렉토리가 존재하지 않는다면 /stand/sysinstall을 사용하는 /src/etc 배포를 첫번째로 추가해주어야 한다. 일단 freebsd.mc를 백업시켜 두었다면 파일의 마지막에 있는 마지막 두 줄의 MAILER 라인 바로 앞에 아래의 라인을 추가하기 위해 자기가 좋아하는 에디터를 사용해보자.
FEATURE("no_default_msa")
오탈자를 점검하고 변화 사항을 저장하자. 이제 다음과 같이 타이핑을 한다.
make freebsd.cf
make freebsd.cf install
cp freebsd.cf /etc/mail/sendmail.cf
우리의 구성 설정 변화사항을 읽기 위해 rc와 sendmail을 구별할 필요가 있다. rc는 기동 시간에서 초기설정 파일을 읽기만 하기 때문에 두 가지 작업을 모두 수행하기위한 가장 쉬운 방법은 직접 타이핑을 치는 것이다.
killall init
프롬프트를 받으면 나는 엔터키를 누르고 그 후에 타이핑을 할 것이다.
exit
모든 사항이 잘 진행되면 에러 메시지가 뜨지 않을 것이며 nmap 스캔으로 돌아갔을 때 출력창에서 오로지 ssh, smtp, http, X11만을 보게될 것이다. 원래의 nmap 스캔으로 잠시 돌아가 보자. 이 "vanilla tcp connect() scan"는 /usr/local/share/misc/nmap-services라고 불리는 파일을 읽은 후 그 파일 내에 정렬된 모든 포트를 위한 시스템 호출을 연결하기 위한 시도를 했다. 접속 요청은 TCP 접속을 위해 듣고 있지 않던 모든 포트에 대해서는 실패했으며 듣고 있는 포트에 대해서는 성공했다. 그러나 이 스캔은 UDP 요청에 귀를 기울여 듣고 있을 수도 있는 데몬은 점검하지는 않는다. 모든 다른 스캔 타입은 수퍼유저 특권을 요구한다. 나는 수퍼유저로 접속하여 UDP 접속을 기꺼이 받아들이는 데몬을 위해 스캔을 하는 sU 스위치를 사용할 것이다.
su 
Password: 
nmap -sU localhost 
 
Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ ) 
Interesting ports on localhost (127.0.0.1): 
(The 1447 ports scanned but not shown below are in state: closed)

Port       State       Service
68/udp     open        bootpc
 
Nmap run completed -- 1 IP address (1 host up) scanned in 11 seconds 
UDP가 접속을 덜 일으키는 전송이기 때문에 접속을 생성해내지 않는다는 사실을 기억해 두어라. UDP 포트 68은 DHCP 클라이언트에 의해 사용되며 내 서비스 제공자와 함께 DHCP 계약을 갱신할 수 있기 때문에 나는 공개된 상태가 필요하다. 이것은 DHCP 서버들이 대신에 UDP 포트 67을 사용하기 때문에 내 컴퓨터에서 DHCP 서버를 실행하는 것을 의미하지는 않는다. 더 이상 진도를 나가기 전에 sockstat 유틸리티를 실행하고 nmap 스캔에 대한 결과를 비교해보자.
sockstat -4
                                    LOCAL    FOREIGN
USER    COMMAND   PID    FD  PROTO  ADDRESS  ADDRESS
root    XF86_SVG  15769   0  tcp4   *:6000   *:*                  
nobody  httpd     14592  16  tcp4   *:80     *:*                  
root    sendmail  12873   4  tcp4   *:25     *:*                  
nobody  httpd     12410  16  tcp4   *:80     *:*                  
nobody  httpd     12409  16  tcp4   *:80     *:*                  
nobody  httpd     12408  16  tcp4   *:80     *:*                  
nobody  httpd     12407  16  tcp4   *:80     *:*                  
nobody  httpd     12406  16  tcp4   *:80     *:*                  
root    httpd     12382  16  tcp4   *:80     *:*                  
root    sshd      12336   3  tcp4   *:22     *:*                  
root    dhclient  12269   3  udp4   *:*      *:*                  
root    dhclient  12269   6  udp4   *:68     *:*
양 유틸리티는 같은 포트 정보를 보여준다는 사실에 유념해야 할 것이다. 내 머신은 포트 22, 25, 80, 6000에 대한 TCP 접속을 받아들이고 포트 68에 대해서는 UDP 접속에 대해서도 기꺼이 받아들일 것이다. 그런데 왜 sockstat 대신에 nmap을 사용해야 하는 것일까? 만약 여러분이 하나의 머신만 보호해야 하고 거기에서 설정을 할 생각이라면 내장 sockstat 유틸리티를 사용하는 것이 훨씬 더 쉽다. 그러나 네트워크 전체의 보안을 테스트해야 한다면 nmap 유틸리티를 사용하여 모든 호스트를 한꺼번에 스캔하는 것이 더 낫다. nmap 유틸리티로 여러분은 결과를 파일에 저장할 수도 있으며 각각의 머신에 어떤 포트가 레코드를 갖을 수 있는지 알 수 있기 때문이다. 또한 sockstat 유틸리티를 실행시키기 위해 각 머신에 저장할 수도 있다. 마지막으로 일단 방화벽이 구축되면 다른 타입의 nmap 스캔을 사용해 방화벽 규정에 대한 반응을 테스트할 수도 있다. 이제 나는 어떤 포트가 내 컴퓨터에 공개되어 있는지 알고있기 때문에 각각의 서비스에 접근할 적당한 방법을 대충 그려나갈 수 있다. 방화벽의 타입이나 패킷 필터링 규정을 만들기 전에 고려해야 할 몇 가지 사항들은 다음과 같다. 첫 번째로 결정해야 할 것은 어떤 타입의 패킷을 내 시스템 속으로 끌어들일지 결정해야 한다는 것이다. 독립형(stand-alone) 컴퓨터만이 인터넷에 접속되기 때문에 들어오는 패킷은 두 가지 타입 중 하나가 될 것이다. 첫 번째 타입은 인터넷으로 내 데몬들 중 하나로 접속하려고 하는 유저로부터 오는 패킷이다. 만약 이러한 패킷들이 TCP 접속을 유발하려고 한다면 그것들은 SYN 플래그 설정을 하겠지만 ACK 플래그는 설정하지 않을 것이다. 이제 나는 내 포트 중의 어떤 것이 접속을 기꺼이 받아들일지 알고 있기 때문에 나는 각각의 것들을 주의 깊게 재점검해야 하며 이러한 데몬으로 인터넷에서 접속하고자 하는 사람들이 내가 진짜 원하는 사람들인지 살펴보아야 할 것이다. 그럼 이제 하나씩 살펴보도록 하자. port 22 또는 ssh 내 머신 내에서 보안 셸을 사용하기 원하는 유일한 사람은 바로 내가 될 것이며 이러한 행동을 인터넷 위에서 실행하고자 계획하지는 않는다. 따라서 나는 이러한 타입의 패킷을 내부로 들어오고 싶지는 않다. port 25 또는 smtp 내 시스템 외부로 이메일을 보내기위해 smtp를 사용하는 동안 나는 다른 smtp 서버로부터 메일을 받아들이는 이 메일 서버를 실행하지 않을 것이다. 따라서 나는 이러한 타입의 패킷을 내부로 들어오고 싶지는 않다. 그러나 내 서비스 제공자로부터 내 이메일을 받고 싶기 때문에 POP3 패킷 내부로 불러들일 것을 기억해 두어야만 할 것이다. (SMTP와 POP3가 작동하는 법은 생각하지 말고 이메일 이해를 살펴보자.) port 80 또는 http 여전히 웹 사이트를 구축 중이기 때문에 잠시동안 http 요청 허용을 중단할 것이다. 웹 사이트가 준비될 때 http 접속 요청을 허용하는 내 방화벽 규정을 변경해야 할 것을 기억하고 있어야 한다. port 6000 또는 X Window protocol 나는 내 Xterminal을 사용하는 인터넷 사용자를 원하지 않기 때문에 이러한 패킷들을 내부로 들여오는 것 또한 허용하지 않을 것이다. UDP port 68 또는 DHCP client 나는 내 DHCP 계약을 갱신하기 위해 이러한 패킷들은 들여올 필요가 있다. UDP가 플래그를 사용하지 않는다는 점을 기억해 두어야 할 것이다. 따라서 이러한 패킷에는 SYN나 ACK 플래그가 없을 것이다. 이제는 들어오는 패킷의 두 번째 타입에 대해 알아보자. 내가 내보낸 패킷들을 위해 인터넷으로부터 온 응답들이다. 방화벽이 패킷에서의 반응에서 허용한다는 것을 알려주는 것을 잊지 않고 있는 한 인터넷으로 패킷을 내보낸다는 것은 별 의미가 없다. 예를 들어 내 웹 브라우저에서 디스플레이 될 수 있는 반응을 받을 수 없다면 웹 서버로 HTTP 요청을 내보내는 것은 아주 실망스러운 일이 될 것이다. 내가 인터넷으로 패킷을 내보내도록 허용하는 타입의 패킷에 규제당하고 싶지 않다면 여전히 내 요청에 반응하지 않는 패킷을 내부로 들여오지 않도록 방화벽에게 말할 수 있다. 이러한 방법을 실행하는 방법이 몇 가지 있으며 나는 실제적인 방화벽 규정을 언제 어떻게 만들어야 할 지에 대해 시연해 보일 것이다. 마지막으로 내가 할 일은 인터넷에서 내가 할 일들을 리스트로 대충이라도 만들어 보는 것이다. 이 리스트는 규정들을 제정할 때 유용한 자료로 사용될 것이다. 어떤 애플리케이션은 약간의 고려사항을 필요로 하기 때문에 방화벽을 통해서 적절하게 작동을 계속할 것이다. 이 때가 몇몇 무료 관련 애플리케이션을 실행해볼 적기이다. 리스트를 만드는 것은 늘 내 방화벽 규정 내에서 유용하게 사용될 약간의 정보와 관련 애플리케이션을 항상 생각나도록 해 줄 것이다. 아래의 사항은 내가 작성한 리스트의 개요이다.
  • 서핑하기위해 필요한 HTTP : 이것은 DNS 또한 필요하다는 사실을 기억하게 해준다.
  • 이메일을 받을 수 있는 POP3
  • 다운로드 받을 경우를 대비하여 FTP : 방화벽을 통과해 FTP를 실행하는 것이 어렵다고 들었으므로 내 북마크를 살펴보아야 할 것이다.
  • DHCP 서비스 제공자의 DHCP 서버로부터 내 IP 주소를 받았기 때문이다.
  • 경로 MTU 발견을 할 수 있는 ICMP : ICMP 타입과 코드를 다시 살펴보아야 할 것이다.
실제적으로 방화벽 규정을 구축하기 시작할 때 더 많은 정보가 필요한 것은 사실이다. 그러나 나는 이 기사가 훌륭한 시작점이 될 수 있다고 생각한다. FreeBSD 시스템에서 방화벽을 구축하는데 필요한 옵션은 다음 기사에서 다룰 예정이다. 드루 라빈(Dru Lavigne)는 캐나다 온타리오주 킹스턴에 있는 공과 전문대학교에서 네트워크를 가르치고 있으며 그녀의 테스트 머신에 몇 개의 운영체제를 멀티 부트로 실행시킬 수 있는지 알아보는 것으로 악명 높다.
TAG :
댓글 입력
자료실

최근 본 책0